﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using condortravel.operaciones.core.DataModel;
using System.Data.Linq;

using condortravel.operaciones.entities.Entities;

namespace condortravel.operaciones.persistence.operacionesImpl
{
    public class ReportDAOImpl : condortravel.operaciones.persistence.Impl.GenericDAO<Tb_Evento, int>
    {

        public override Tb_Evento update(Tb_Evento entity)
        {
            throw new NotImplementedException();
        }

        public override Tb_Evento getByID(int id)
        {
            throw new NotImplementedException();
        }

        public override void delete(int pk)
        {
            throw new NotImplementedException();
        }

        public List<Tb_Evento> getReporteEvento(FilterItinerarioCriteria filter)
        {
            using (ImpersonationHelper imp = new ImpersonationHelper(this.Impersonation.User, this.Impersonation.Domain, this.Impersonation.Password))
            {
                if (IsImpersonate)
                {
                    if (!imp.ImpersonateUser())
                    {
                        throw new Exception("The Impersonate has failed");
                    }

                }
                using (DataContext dataContext = this.getInstanceDataContextFactory())
                {

                    DataLoadOptions options = new DataLoadOptions();
                    options.LoadWith<Tb_Evento>(s => s.Tb_ServiciosProgramado);
                    options.LoadWith<Tb_Evento>(s => s.Tb_Estado_Evento);
                    options.LoadWith<Tb_ServiciosProgramado>(s => s.Tb_ItinerarioViajero);
                    options.LoadWith<Tb_ItinerarioViajero>(s => s.Tb_Cliente);
                    options.LoadWith<Tb_ItinerarioViajero>(s => s.Tb_Agencia);
                    dataContext.LoadOptions = options;
                    
                    return (from p in dataContext.GetTable<Tb_Evento>()
                            where
                            ((p.Tb_ServiciosProgramado.Tb_ItinerarioViajero.itinerarioViajero_ID == filter.Itinerario && filter.Itinerario != 0) || (filter.Itinerario == 0)) &&
                            ((p.agencia_ID == filter.Agencia && filter.Agencia != 0) || (filter.Agencia == 0)) &&
                            ((p.Tb_ServiciosProgramado.Tb_ItinerarioViajero.Tb_Cliente.cliente_ID==filter.Cliente && filter.Cliente!=0) || (filter.Cliente==0)) &&
                            ((p.estadoEvento_ID == filter.Estado && filter.Estado != 0) || (filter.Estado == 0)) &&
                            ((p.fechaEvento >= filter.FecInicio && filter.FecInicio != DateTime.MinValue) || (filter.FecInicio == DateTime.MinValue)) &&
                            ((p.fechaEvento <= filter.FecFin && filter.FecFin != DateTime.MinValue) || (filter.FecFin == DateTime.MinValue))                            
                            select p).ToList<Tb_Evento>();
                }

            }
        }


        public List<Tb_Incidencia> getReporteIncidencia(FilterIncidentesCriteria filter)
        {
            using (ImpersonationHelper imp = new ImpersonationHelper(this.Impersonation.User, this.Impersonation.Domain, this.Impersonation.Password))
            {
                if (IsImpersonate)
                {
                    if (!imp.ImpersonateUser())
                    {
                        throw new Exception("The Impersonate has failed");
                    }

                }
                using (DataContext dataContext = this.getInstanceDataContextFactory())
                {

                    DataLoadOptions options = new DataLoadOptions();
                    options.LoadWith<Tb_Incidencia>(s => s.Tb_GrupoAsignacion);
                    options.LoadWith<Tb_Incidencia>(s => s.Tb_Agente);
                    options.LoadWith<Tb_Incidencia>(s => s.Tb_Cliente);

                    options.LoadWith<Tb_Incidencia>(s => s.Tb_Pai);
                    options.LoadWith<Tb_Incidencia>(s => s.Tb_Ciudad);
                    options.LoadWith<Tb_Incidencia>(s => s.Tb_Estado_Incidencia);
                    dataContext.LoadOptions = options;

                    return (from p in dataContext.GetTable<Tb_Incidencia>()
                            where
                            ((p.Tb_Pai.pais_ID == filter.Pais && filter.Pais != 0) || (filter.Pais == 0)) &&
                            ((p.Tb_Ciudad.ciudad_ID == filter.Ciudad && filter.Ciudad != 0) || (filter.Ciudad == 0)) &&
                            ((p.fechaRegistro >= filter.FecInicio && filter.FecInicio != DateTime.MinValue) || (filter.FecInicio == DateTime.MinValue)) &&
                            ((p.fechaRegistro <= filter.FecFin && filter.FecFin != DateTime.MinValue) || (filter.FecFin == DateTime.MinValue))
                            select p).ToList<Tb_Incidencia>();
                }

            }
        }

    }
}
